package org.powernode.proxy.client;

import org.powernode.proxy.sevice.OrderService;
import org.powernode.proxy.sevice.OrderServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Client {
    public static void main(String[] args) {
        //创建目标对象
        OrderService orderService = new OrderServiceImpl();
        //创建代理对象
        /**
         * newProxyInstance:新建一个代理对象，三个参数
         * ClassLoader loader:类加载器，要跟目标对象是同一个类加载器
         * Class<?>[] interfaces：目标对象的接口
         * InvocationHandler h：调用处理器
         *      invoke方法，三个参数
         *          Object proxy,
         *          Method method：当前需要执行的方法，直接通过反射直接
         *          Object[] args：当前执行方法需要的参数
         *
         */
        OrderService proxy = (OrderService) Proxy.newProxyInstance(orderService.getClass().getClassLoader(), orderService.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("invoke method:" + method.getName());
                long start = System.currentTimeMillis();
                //反射执行方法
                Object invokeValue = method.invoke(orderService, args);
                long end = System.currentTimeMillis();
                System.out.println("generate耗时时间" + (end - start) + "ms");
                //执行方法的返回值进行返回
                return invokeValue;
            }
        });
        proxy.generate();
        proxy.modify();
        proxy.detail();
    }
}
